<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            padding-bottom: 800px;
            padding-left: 30px;
        }
        .cbox{
            border: 1px solid #999;
            padding: 20px;
            margin: 10px 0px;
        }
    </style>
</head>
<body>
    <div id="app">
        <h4>vuex的安装和使用</h4>
        <ul>
            <li>因为vuex的state数据仓库是以独立的响应式数据方式共享变量给组件使用</li>
            <li>因此在组件中直接对$store.state中的数据变量进行修改，可以触发独立的响应式数据功能</li>
            <li>上述操作不建议直接使用，因为违背单向数据流规则(构建修改日志的)</li>
            <li>建议使用commit方式完成仓库数据的构建</li>
        </ul>
        <p>vuex-msg:{{ $store.state.msg }}</p>
        <input v-model="$store.state.msg" type="text" />
        <input type="button" value="修改MSG数据" @click="setNewMsg()">
        <hr>
        <p>vuex--computed-msg:{{ msg }}</p>
        <input v-model="msg" type="text" />

        <comp-a></comp-a>
    </div>
    <script type="text/x-template" id="compA">
        <div class="cbox">
            <h4>子组件</h4>
            <p>vuex-msg:{{ $store.state.msg }}</p>
            <input v-model="$store.state.msg" type="text" />
            <hr>
            <p>vuex--computed-msg:{{ msg }}</p>
            <input v-model="msg" type="text" />
        </div>
    </script>
    <script src="../../assets/vue3/vue.global.js"></script>
    <script src="../../assets/vuex4/vuex.global.js"></script>
    <script>
        const store = Vuex.createStore({
            state:{
                // 共享的数据状态仓库
                msg:"vuex的共享数据",
                num:100
            },
            mutations: {
                // 突变方法定义
                setMsg(state,nv){
                    // state 为当前$store.state 数据
                    state.msg = nv;
                },
                setNum(state,nv){
                    state.num = nv;
                }
            }
        })

        const CompA = {
            template:"#compA",
            computed: {
                msg:{
                    get(){
                        return this.$store.state.msg
                    },
                    set(nv){
                        this.$store.commit("setMsg",nv)
                    }
                }
            },
        }

        Vue.createApp({
            components: {
                CompA,
            },
            computed: {
                msg:{
                    get(){
                        return this.$store.state.msg
                    },
                    set(nv){
                        this.$store.commit("setMsg",nv)
                    }
                }
            },
            methods: {
                setNewMsg() {
                    this.$store.commit("setMsg",Math.random())
                }
            },
        })
        .use(store)
        .mount("#app")
    </script>
</body>
</html>